VimUnDoT,^ڕw<2ہ$?`u7<2 //containerDialog.openWithStatus()9@@@@hH3K_h1*f" import { app } from "/app.js";5_h1#z 5_$h1#$5_$h1#$5_$h1#$5_$h1#$5_$h1#$5_ $h1#$5_ $h1#$5_ $h1#$5_ $h1#$5_ $h1#$5_  $h1#$5_ $h1#$5_$h1#$5_$h1#$5_$h1#$5_$h1#$5_$h1#$5_$h1#$5_$h1#$" import { app } from "/app.js";5_$h1#$, import { Schedule } from "/schedule.js";5_$h1#$1 const channelUid = "{{ channel.uid.value }}";5_$h1#$@ const chatInputField = document.querySelector("chat-input");5_$h1#$& chatInputField.autoCompletions = {5_$h1#$ "/online": () =>{5_$ h1#$ showOnline();5_$h1#$ },5_$h1#$ "/clear": () => {5_$ h1#$D document.querySelector(".chat-messages").innerHTML = '';5_ $h1#$ },5_! $h1#$ "/live": () =>{5_ "!$ h1#$ 5_!#"$ h1#$> chatInputField.liveType = !chatInputField.liveType5_"$#$h1#$ },5_#%$$h1#$ "/help": () => {5_$&%$ h1#$ showHelp();5_%'&$h1#$ }5_&('$h1#$ }5_')($h1#$3 app.ws.addEventListener("refresh", (data) => {5_(*)$ h1#$0 app.starField.showNotify(data.message);5_)+*$ h1#$ setTimeout(() => {5_*,+$ h1#$& window.location.reload();5_+-,$ h1#$ },4000)5_,.-$h1#$ })5_-/.$h1#$3 app.ws.addEventListener("deployed", (data) => {5_.0/$ h1#$N app.starField.renderWord("Deployed",{"rainbow":true,"resolution":8});5_/10$ h1#$ setTimeout(() => {5_021$ h1#$, app.starField.shuffleAll(5000);5_132$ h1#$ },10000)5_243$h1#$ }) 5_354$h1#$A app.ws.addEventListener("starfield.render_word", (data) => {5_465$ h1#$2 app.starField.renderWord(data.word,data);5_576$h1#$ }) 5_687$h1#$E const textBox = document.querySelector("chat-input").textarea5_798$h1#$8 textBox.addEventListener("paste", async (e) => {5_8:9$ h1#$ try {5_9;:$h1#$H const clipboardItems = await navigator.clipboard.read();5_:<;$h1#$5_;=<$h1#$V // DataTransfer needs to be used to modify the files list of the input5_<>=$h1#$. const dt = new DataTransfer();5_=?>$h1#$5_>@?$h1#$= for (const clipboardItem of clipboardItems) {5_?A@$h1#$c const fileTypes = clipboardItem.types.filter(type => !type.startsWith('text/'))5_@BA$h1#$7 for (const fileType of fileTypes) {5_ACB$h1#$5_BDC$h1#$K const blob = await clipboardItem.getType(fileType);5_CED$h1#$< // Do something with the image blob.5_DFE$h1#$X dt.items.add(new File([blob], "image.png", { type: fileType }));5_EGF$h1#$ }5_FHG$h1#$ }5_GIH$h1#$5_HJI$h1#$* if (dt.items.length > 0) {5_IKJ$h1#$D const uploadButton = chatInputField.uploadButton5_JLK$h1#$V const input = uploadButton.shadowRoot.querySelector('.file-input')+ input.files = dt.files;5_KML%h1$%5 await uploadButton.uploadFiles();5_LNM%h1$% }5_MON% h1$% } catch (error) {5_NPO%h1$%L console.error("Failed to read clipboard contents: ", error);5_OQP% h1$% }5_PRQ%h1$% });5_QSR%h1$%5_RTS%h1$% 5_SUT%h1$%5_TVU%h1$%> const chatInput = document.querySelector(".chat-area")5_UWV%h1$%9 chatInput.addEventListener("drop", async (e) => {5_VXW% h1$% e.preventDefault();5_WYX%h1$%5_XZY% h1$%& const dt = e.dataTransfer;5_Y[Z% h1$%& if (dt.items.length > 0) {5_Z\[%h1$%@ const uploadButton = chatInputField.uploadButton5_[]\%h1$%R const input = uploadButton.shadowRoot.querySelector('.file-input')5_\^]%h1$%' input.files = dt.files;5_]_^%h1$%5_^`_%h1$%1 await uploadButton.uploadFiles();5__a`% h1$% }5_`ba%h1$% })5_acb%h1$%= chatInput.addEventListener("dragover", async (e) => {5_bdc% h1$% e.preventDefault();5_ced% h1$%/ e.dataTransfer.dropEffect = "link";5_dfe%h1$% 5_egf%h1$%5_fhg%h1$% })5_gih%h1$%5_hji% h1$%, chatInputField.textarea.focus();5_ikj%h1$%5_jlk%h1$% 5_kml%h1$%5_lnm%h1$%$ function replyMessage(message) {5_mon%h1$%$ const field = chatInputField5_npo%h1$%F field.value = "```markdown\n> " + (message || '') + "\n```\n";5_oqp%h1$% field.focus();5_prq%h1$% }5_qsr%h1$%5_rts%h1$% function updateTimes() {5_sut%h1$%C document.querySelectorAll(".time").forEach((container) => {5_tvu% h1$%= const messageDiv = container.closest('.message');5_uwv% h1$%: const userNick = messageDiv.dataset.user_nick;5_vxw% h1$%E const text = messageDiv.querySelector(".text").innerText;5_wyx% h1$%8 const time = document.createElement("span");5_xzy% h1$%O time.innerText = app.timeDescription(container.dataset.created_at);5_y{z%h1$%5_z|{% h1$%, container.replaceChildren(time);5_{}|% h1$%6 const reply = document.createElement("a");5_|~}% h1$%' reply.innerText = " reply";5_}~% h1$%" reply.href = "#reply";5_~% h1$%) container.appendChild(reply);5_% h1$%4 reply.addEventListener('click', (e) => {5_%h1$%# e.preventDefault();5_%h1$%# replyMessage(text);5_% h1$% })5_%h1$% });5_%h1$% }5_%h1$%5_%h1$%( function isElementVisible(element) {5_%h1$%5 const rect = element.getBoundingClientRect();5_%h1$% return (5_% h1$% rect.top >= 0 &&5_% h1$% rect.left >= 0 &&5_% h1$%[ rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&5_% h1$%U rect.right <= (window.innerWidth || document.documentElement.clientWidth)5_%h1$% );5_%h1$% }5_%h1$%5_%h1$%G const messagesContainer = document.querySelector(".chat-messages");5_%h1$%5_%h1$%# function isScrolledPastHalf() {5_%h1$%4 let scrollTop = messagesContainer.scrollTop;5_%h1$%_ let scrollableHeight = messagesContainer.scrollHeight - messagesContainer.clientHeight;5_%h1$%5_%h1$%/ if (scrollTop < scrollableHeight / 2) {5_% h1$% return true;5_%h1$% }5_%h1$% return false;5_%h1$% }5_%h1$%5_%h1$% let isLoadingExtra = false;5_%h1$%5_%h1$% async function loadExtra() {5_%h1$%U const firstMessage = messagesContainer.querySelector(".message:first-child");5_%h1$% if (isLoadingExtra) {5_% h1$% return;5_%h1$% }5_%h1$%$ if (!isScrolledPastHalf()) {5_% h1$% return;5_%h1$% }5_%h1$%5_%h1$% isLoadingExtra = true;5_%h1$%5_%h1$%c const messages = await app.rpc.getMessages(channelUid, 0, firstMessage.dataset.created_at);5_%h1$%5_%h1$%' messages.forEach((message) => {5_% h1$%I firstMessage.insertAdjacentHTML("beforebegin", message.html);5_%h1$% })5_%h1$% updateLayout(false);5_%h1$%5_%h1$% isLoadingExtra = false;5_%h1$% }5_%h1$%5_%h1$%8 messagesContainer.addEventListener("scroll", () => {5_%h1$% loadExtra();5_%h1$% });5_%h1$%5_%h1$% let lastMessage5_%h1$%5_%h1$%) function updateLayout(doScrollDown) {5_%h1$%K const messagesContainer = document.querySelector(".chat-messages");5_%h1$% updateTimes();5_%h1$% let previousUser = null;5_%h1$% let previousDate = null;5_%h1$%D document.querySelectorAll(".message").forEach((message) => {5_% h1$%< if (previousUser !== message.dataset.user_uid) {5_%h1$%5 message.classList.add("switch-user");5_%h1$%8 previousUser = message.dataset.user_uid;5_%h1$%D previousDate = new Date(message.dataset.created_at);5_% h1$% } else {5_%h1$%8 message.classList.remove("switch-user");5_%h1$%5_%h1$%$ if (!previousDate) {5_%h1$%H previousDate = new Date(message.dataset.created_at);5_%h1$% } else {5_%h1$%M const currentDate = new Date(message.dataset.created_at);5_%h1$%5_%h1$%Z if (currentDate.getTime() - previousDate.getTime() > 1000 * 60 * 20) {5_%h1$%; message.classList.add("long-time");5_%h1$% } else {5_%h1$%> message.classList.remove("long-time");5_%h1$% }5_%h1$%/ previousDate = currentDate;5_%h1$% }5_% h1$% }5_%h1$% });5_%h1$%M lastMessage = messagesContainer.querySelector(".message:last-child");5_%h1$% if (doScrollDown) {5_% h1$%. messagesContainer.scrollToBottom()5_%h1$%5_%h1$% }5_%h1$% }5_%h1$%5_%h1$%$ setInterval(updateTimes, 30000);5_%h1$%5_%h1$%$ function isMentionToMe(message){5_%h1$%9 const mentionText = '@{{ user.username.value }}';5_%h1$%; return message.toLowerCase().includes(mentionText);5_%h1$% }5_%h1$%' function extractMentions(message) {5_%h1$%: return [...new Set(message.match(/@\w+/g) || [])];5_%h1$% }5_%h1$%. function isMentionForSomeoneElse(message){5_%h1$%2 const mentions = extractMentions(message);5_%h1$%9 const mentionText = '@{{ user.username.value }}';5_%h1$%J return mentions.length > 0 && mentions.indexOf(mentionText) == -1;5_%h1$% }5_%h1$%5_%h1$%7 app.addEventListener("channel-message", (data) => {5_%h1$% let display = 'block';5_%h1$%, if(!data.text || !data.text.trim()){5_% h1$% display = "none";5_%h1$% }5_%h1$%. if (data.channel_uid !== channelUid) {5_% h1$%7 if(!isMentionForSomeoneElse(data.message)){5_%h1$%, channelSidebar.notify(data);5_%h1$%5 app.playSound("messageOtherChannel");5_% h1$% }5_%h1$%5_% h1$% return;5_%h1$% }5_%h1$%< if (data.username !== "{{ user.username.value }}") {5_% h1$%, if(isMentionToMe(data.message)){5_%h1$%) app.playSound("mention");5_% h1$%> }else if (!isMentionForSomeoneElse(data.message)){5_%h1$%) app.playSound("message");5_% h1$% }5_%h1$% }5_%h1$%5_%h1$%K const messagesContainer = document.querySelector(".chat-messages");5_%h1$%M lastMessage = messagesContainer.querySelector(".message:last-child");5_%h1$%T const lastElement = messagesContainer.querySelector(".message-list-bottom");5_%h1$%f const doScrollDownBecauseLastMessageIsVisible = !lastMessage || isElementVisible(lastMessage);5_%h1$%5_%h1$%6 const message = document.createElement("div");5_%h1$%& message.innerHTML = data.html;5_%h1$%' message.style.display = display5_ %h1$%^ document.querySelector(".chat-messages").insertBefore(message.firstChild,lastElement);5_  %h1$%> updateLayout(doScrollDownBecauseLastMessageIsVisible);5_   %h1$% setTimeout(() => {5_   % h1$%A updateLayout(doScrollDownBecauseLastMessageIsVisible)5_   %h1$% }, 1000);5_  %h1$%' app.rpc.markAsRead(channelUid);5_ %h1$% });5_%h1$%5_%h1$% let escPressed = false;5_%h1$% let gPressCount = 0;5_%h1$% let keyTimeout;5_%h1$%: document.addEventListener('keydown', function(event) {5_%h1$% 5_%h1$%$ if (event.key === 'Escape') {5_% h1$% escPressed = true;5_% h1$% gPressCount = 0; 5_% h1$%% clearTimeout(keyTimeout);5_% h1$%+ keyTimeout = setTimeout(() => {5_%h1$%$ escPressed = false; 5_% h1$% }, 300); 5_%h1$% }5_%h1$%5_%h1$%. if (event.key === 'G' && escPressed) {5_ % h1$% gPressCount++;5_! %h1$%5_ "!% h1$%% clearTimeout(keyTimeout);5_!#"% h1$%+ keyTimeout = setTimeout(() => {5_"$#%h1$% gPressCount = 0;5_#%$% h1$% }, 300); 5_$&%% h1$%$ if (gPressCount === 2) {5_%'&%h1$%! gPressCount = 0; 5_&('%h1$%$ escPressed = false; 5_')(%h1$%5_(*)% h1$%w messagesContainer.querySelector(".message:last-child").scrollIntoView({ block: "end", inline: "nearest" });5_)+*%h1$%" setTimeout(() => {5_*,+%h1$% 5_+-,%h1$%+ chatInputField.focus();5_,.-%h1$% },500)5_-/.%h1$%5_.0/% h1$% }5_/10%h1$% }5_021%h1$%2 if (event.shiftKey && event.key === 'G') {5_132% h1$%* if(chatInputField.isActive()){5_243% h1$% 5_354%h1$%# updateLayout(true);5_465%h1$%" setTimeout(() => {5_576%h1$%+ chatInputField.focus();5_687%h1$% },500)5_798% h1$% }5_8:9%h1$%5_9;:%h1$% }5_:<;%h1$% });5_;=<%h1$%5_<>=%h1$%8 messagesContainer.addEventListener('click', (e) => {5_=?>%h1$%$ if(e.target.tagName != 'IMG')5_>@?% h1$% return5_?A@%h1$% const img = e.target5_@BA%h1$%0 if(e.target.classList.contains('avatar')){5_ACB% h1$% return5_BDC%h1$% }5_CED%h1$%4 const overlay = document.createElement('div');5_DFE%h1$%' overlay.style.position = 'fixed';5_EGF%h1$% overlay.style.top = 0;5_FHG%h1$% overlay.style.left = 0;5_GIH%h1$%# overlay.style.width = '100%';5_HJI%h1$%$ overlay.style.height = '100%';5_IKJ%h1$%8 overlay.style.backgroundColor = 'rgba(0,0,0,0.9)';5_JLK%h1$%% overlay.style.display = 'flex';5_KML%h1$%. overlay.style.justifyContent = 'center';5_LNM%h1$%* overlay.style.alignItems = 'center';5_MON%h1$%" overlay.style.zIndex = 9999;5_NPO%h1$%5_OQP%h1$%4 const fullImg = document.createElement('img');5_PRQ%h1$%5_QSR%h1$%& const urlObj = new URL(img.src);5_RTS%h1$% urlObj.search = ''5_SUT%h1$%( fullImg.src = urlObj.toString();5_TVU%h1$%5_UWV%h1$% fullImg.alt = img.alt;5_VXW%h1$%% fullImg.style.maxWidth = '90%';5_WYX%h1$%& fullImg.style.maxHeight = '90%';5_XZY%h1$%5_Y[Z%h1$%# overlay.appendChild(fullImg);5_Z\[%h1$%5_[]\%h1$%) document.body.appendChild(overlay);5_\^]%h1$%5_]_^%h1$%/ overlay.addEventListener('click', () => {5_^`_%h1$%+ document.body.removeChild(overlay);5__d`%h1$% });5_`ead%h1$% });5_dfe%h1$% updateLayout(true);5_egfAh1C&\ chatInputField.value = "markdown\n> " + (message || '') + "\n chatInputField.focus();5_fhgh1Y' overlay.style.cssText = 3position:fixed;top:0;left:0;width:100%;height:100%;'; position:fixed;top:0;left:0;width:100%;height:100%;5_gihh1_&P overlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;`background:rgba(0,0,0,0.9);display:flex;justify-content:center;align-items:center;z-index:9999;;&h background:rgba(0,0,0,0.9);display:flex;justify-content:center;align-items:center;z-index:9999;;5_hjih1c% overlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.9);display:flex;justify-content:center;align-items:center;z-index:9999;;5_ikjh1g% overlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.9);display:flex;justify-content:center;align-items:center;z-index:9999;";5_jlkh1h%overlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.9);display:flex;justify-content:center;align-items:center;z-index:9999;";5_kmlh1{% overlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.9);display:flex;justify-content:center;align-items:center;z-index:9999;;5_lnm&h1%C chatInputField.value = "markdown\n> " + (message || '') + "\n";5_monh1%C chatInputField.value = "markdown\n> " + (message || '') + "\n";5_npoDh1%F chatInputField.value = "```markdown\n> " + (message || '') + "\n";5_oqph1L%( if (chatInputField.isActive()) {5_prqh1O% }5_qsrh1i%* if (event.key === 'G' && escPressed) {5_rts h1% updateLayout(true);5_sut h1& &5_tvu*h1' if(ch '&* if (event.key === 'g' && escPressed) {5_uwv+h1& '+ escPressed = true; gPressCount = 0;5_vxwh1j ( alert("aaa')5_wyxh1B ( alert("aaa")(5_xzyBh1W (D keyTimeout = setTimeout(() => { escPressed = false; }, 300);5_y{zBh1[ (E keyTimeout = setTimeout(() => { escPressed = false; }, 1000);5_z|{h1m( }5_{}|h1) gPressCount++;5_|~}:h1*x messagesContainer.querySelector(".message:last-child")?.scrollIntoView({ block: "end", inline: "nearest" });5_}~h1+ console.info +* console.info(event.key)5_~'h1+* if (event.key === 'g' && escPressed) {+5_Fh1+I if (event.key === 'g' && !chatInputField.isActive() && !escPressed) {5_h1- if(chatInputField.isActive()) return;5_ h1: setTimeout(() => chatInputField.focus(), 500);5_0h1)0 gPressCount = 0; escPressed = false;5_h1 console.info("HIER")5_h1D keyTimeout = setTimeout(() => { escPressed = false; }, 100);5_h1&! clearTimeout(keyTimeout);5_h1)&+ escPressed = true; gPressCount = 0;5_h1H& }5_h1H' '5_ h1'* // if (chatInputField.isActive()) {5_ h1' // }5_ h1'( if (chatInputField.isActive()) {'5_h2V$ console.info(event.key)5_h2V% console.info(escPressed)5_h5u%{% extends "app.html" %}L{% block header_text %}

{{ name }}

{% endblock %} {% block main %}
( % {% for message in messages %}" {% autoescape false %} {{ message.html }} {% endautoescape %} {% endfor %}/

Q
{% include "dialog_help.html" %}"{% include "dialog_online.html" %}{% endblock %}5_vh5z $function isElementVisible(element) {1 const rect = element.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 &&W rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&Q rect.right <= (window.innerWidth || document.documentElement.clientWidth) );}5_Fvh5z G const doScrollDown = !lastMessage || isElementVisible(lastMessage);5_5h5{  < const doScrollDown = messagesContainer.isScrolledDown();5_;h5{ > const doScrollDown = messagesContainer.isScrolledToDown();5_h5I lastMessage = messagesContainer.querySelector(".message:last-child");5_h5O const lastMessage = messagesContainer.querySelector(".message:last-child");5_h5let lastMessage;5_h6 * if (data.channel_uid !== channelUid) {5_h6  &if (data.channel_uid !== channelUid) { * if (data.channel_uid !== channelUid) {5_h6 C let display = data.text && data.text.trim() ? 'block' : 'none';5_h6  5_h6 * if (data.channel_uid !== channelUid) {5_h6  5_h6  }5_vh6 * if (data.channel_uid !== channelUid) {5 if (!isMentionForSomeoneElse(data.message)) {( channelSidebar.notify(data);1 app.playSound("messageOtherChannel"); } return; }% if (data.username !== username) {* if (isMentionToMe(data.message)) {% app.playSound("mention");< } else if (!isMentionForSomeoneElse(data.message)) {% app.playSound("message"); } }5_vh6 " message.innerHTML = data.html;5_vh6. 5_vh602 const message = document.createElement("div");5_vh61 const oldMessage =  5_Pvh6Zi const oldMessage = messagesContainer.querySelector(`.message[data-message_id="${data.message_id}"]`);5_\vh6gb const oldMessage = messagesContainer.querySelector(`.message[data-uid="${data.message_id}"]`);5_[vh6k oldM [ const oldMessage = messagesContainer.querySelector(`.message[data-uid="${data.uid}"]`);5_vh6r oldMessage?.remove();5_ h6OQ 5_h6" if(data.is_final){5_h6% }5_h6' dd}5_vh6+. if (data.channel_uid !== channelUid) {9 if (!isMentionForSomeoneElse(data.message)) {, channelSidebar.notify(data);5 app.playSound("messageOtherChannel"); } return; }) if (data.username !== username) {. if (isMentionToMe(data.message)) {) app.playSound("mention");@ } else if (!isMentionForSomeoneElse(data.message)) {) app.playSound("message"); } }5_ h6% app.playSound("message");5_ h6 5_%h6% app.playSound("message");5_ h6% app.playSound("message");5_h6" if(event.key == 'i' && !chatI  }5_h6( 5_h6. if(  }5_h678 if(event.key == 'k' && !chatInputField.isActive()) {5_h67 5_h68 }5_h6 if(event.key == 'r' && !c  }5_h6! window.location.reload(); 5_h6) document.querySelector('.time a')5_h6, document.querySelectorAll('.time a')5_?h6? const replyLinks = document.querySelectorAll('.time a')5_h6!!5_h6!" replyLinks[0].click();!5_6h6 !6 replyLinks[replyLinks.length - 1].click();5_ h6!- replyLinks[replyLinks.length - 1]5_?h6!? const replyLink = replyLinks[replyLinks.length - 1]5_h7]c"});5_<v<h7]%%5_<v<h7]'J app.starField.renderWord("Deployed", { rainbow: true, resolution: 8 });5_<v<h7]'< setTimeout(() => app.starField.shuffleAll(5000), 10000);5_<v<h7]'< setTimeout(() => app.starField.shuffleAll(5000), 10000);'5_'<v<h7]&K app.starField.renderWord("Deployed", { rainbow: true, resolution: 8 });5_$<v<h7] &0app.ws.addEventListener("render_word", (data)=>{5_'h7_"&3app.ws.addEventListener("render_message", (data)=>{5_ hC &% {% for message in messages %}5_ hC ) {%  ) '  '5_ hC" ) )5_ #hC(# )' 5_ hCn )* 5_ hCo *  *5_ %hC{ *=
No messages yet
 * * *5_ hC *
No messages yet
5_ hC , ,5_ =hC - -5_ hC .>

Press /online to see who's online.

5_ 6hC .<

Press /help to see who's online.

5_ 7hC .<

Press /help to see who's online.

 .5_ hC .F

Press /help to see all available commands.

5_ hC .6

Press /online to see who's online.

 .>

Press /online to see who's online.

5_ hC - 5_ hC . .5_hC$ / >

Press /help to see all available commands.

 /F

Press /help to see all available commands.

5_ hC% .
5_ )hC"& .
5_ |hC=' .
 .5_ (hCc .
5_hCg(* 5_ hhC) -
5_ =hC* -
5_ hC -'

Welcome to {{ name }}!

5_ hC& -9

Welcome to your new channel: {{ name }}!

5_ hC,+ -5

Welcome to new channel: {{ name }}!

5_ .hCY -4

Welcome to new channel: {{ name }}!

5_ hC^, -

New channel!

5_ hC- -
5_ 4hC| -
5_ 7hC. -
5_ 2hC/ -
5_ *hC -
5_ :hC -
5_  vhC% '(  '  - {% if not messages %}


New channel

>

Press /online to see who's online.

F

Press /help to see all available commands.


 {% endif %}5_B0vhC' &
5_ B 0vhC(' '5_B0vhC*0 -{% if not messages %}5_ hC^1 -
5_ "hC2 -
5_ hC -
5_ hC  dd
5_ vhC , {% if not messages %}

New channel

>

Press /online to see who's online.

F

Press /help to see all available commands.


 {% endif %}( 5_ vhC &0 5_ vhC &% {% for message in messages %}5_ vhC ') {% for message in messages %}5_ vhC'  '5_ vhC -

New channel

5_ vhC3 . 5_ hCt .

New channel

5_ hCw 0
5_ hCx 1 15_  vhC| : 
'

Welcome to your new channel!

U

This is the start of something great. Use the commands below to get started:


    F
  • Press /online to see who's currently online.
  • E
  • Press /help to view all available commands.
  • 


Enjoy chatting!


5_  vhC~ :
+

Welcome to your new channel!

Y

This is the start of something great. Use the commands below to get started:

    J
  • Press /online to see who's currently online.
  • I
  • Press /help to view all available commands.


Enjoy chatting!

5_ vhC
5_ vhC 5_ vhC5_  vhC

New channel

5_ vhC>

Press /online to see who's online.

5_ vhCF

Press /help to see all available commands.

5_ vhC4
5_ hC335_  #hC4N
  • Press /online to see who's currently online.
  • 5_   HhC54N
  • Press /invite to see who's currently online.
  • 45_   hDql "4 !45_   hDqz6!5 {% include "dialog_help.html" %}5_  3hDq7356 "/contain 456456255 "/help": showHelp5_ 4hDr83562 "/container": containerDialog.openWithStatus()4565_4hDr3568 "/container": () => containerDialog.openWithStatus()5_49hDr93569 "/container": () =>{ containerDialog.openWithStatus()5_hET  7
    5_hET 7!
    5_5hETK477: "/container": () =>{ containerDialog.openWithStatus()}5_6(hETN588) containerDialog.openWithStatus()}5_6hETP589( containerDialog.openWithStatus()5_7hETQ68:$ containerDialog.openWithStatus()5_6hETQ57: 5_.hETZ-/:5_6hET_59: 5_7hETg69<78<78<5_7,hET8:? do 9:?9:?9:?9:?7:>" container.classList.t 89>69=, container = await getContainer()5_80hET79?0 container.classList.toggle("hidden")5_7,hET79@ const terminal 89@69?, container = await getContainer()5_9hET8:@0 container.classList.toggle("hidden")5_ : hET9<@F document.domQuerySelector("chat-message").toggle("hidden")5_! : hET:9;A :;A5_ "!7hEU";68A, container = await getContainer()5_!#"5hEU7<46A "/container": () =>{ 5_"$#; hEV =:;F document.domQuerySelector("chat-message").toggle("hidden")5_#%$;hEV>9;@& container.render(terminal):<@5_$'%hE]0 ?0 5_%(&'hE]J? @  @5_')(<hE;=C@ const terminal = document.querySelector("#terminal")5_(*); hE:<C3 container = await window.getContainer()5_)+*;hE@:<C: window.container = await window.getContainer()5_*,+<hE;=C@ const terminal = document.querySelector("#terminal")5_+-,=hE<>C/ terminal.classList.toggle("hidden")5_,.->%hE=?C& container.render(terminal)5_-/.>hE=?C& container.render(window.t)5_.0/@hE?AC( containerDialog.openWithStatus()5_/10< hE;>C: window.t = document.querySelector("#terminal")5_021< hEA;=D <=D5_132hFBD5_243 hGC "E 5_465!6hGo "EK 5_5=6!hGqE "E. 5_6>7=!hH0I !- 5_=?>2hH012let container = null5_>@?99? v hH0J8:<2 //containerDialog.openWithStatus()8:C if(container == null){2 window.c = await window.getContainer()" await window.c.start(): window.t = document.querySelector("#terminal")/ window.t.classList.toggle("hidden")% window.c.render(window.t) }* //containerDialog.openWithStatus()5_?@9hH3K8:<2 //containerDialog.openWithStatus()5_68=7!hGF "E5_798= hH0<>5_8:9= hH0<>5_9;:= hH0<>5_:<;= hH0G<>5_;<<hH0!H;=A# await window.getContainer()5_%'&hE]2 @ @: onst chatArea = document.querySelector(".chat-area");-const channelUid = "{{ channel.uid.value }}";-const username = "{{ user.username.value }}";l 5_0h7_&&H await self.services.socket.send_to_user(self.user_uid, call)5_`bda%h1$&5_acb%h1$&5_bc%h1$&5